//
//  NSObject+ModelJson.h
//  ReviewDemo
//
//  Created by 苏沫离 on 2018/3/19.
//  Copyright © 2018年 long. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol ModelJsonDelegate<NSObject>

@optional

+ (NSDictionary *)arrayContainModelClass;

@end


@interface NSObject (ModelJson)

+ (instancetype)modelWithParserDict:(NSDictionary *)dict;
+ (instancetype)modelWithDict1:(NSDictionary *)dict;//简单字典转模型
+ (instancetype)modelWithDict2:(NSDictionary *)dict;//字典套字典 转模型
+ (instancetype)modelWithDict3:(NSDictionary *)dict;//字典套数组 转模型

@end

/*
 runtime 实现 字典 转 Model
 字典转模型的方式：
  1、一个一个的给模型属性赋值（初学者）
  2、字典转模型KVC实现：
     - (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;
     注意问题：必须保证，模型中的属性和字典中的key 一一对应。如果模型中的属性和字典的key不一一对应，系统就会调用setValue:forUndefinedKey:报错。
     解决办法：重写对象的setValue:forUndefinedKey:，把系统的方法覆盖，就能继续使用KVC，字典转模型了。
     底层实现：
 [dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop)
 {
        [model setValue:obj forKey:key];
 }];
 
  3、字典转模型 Runtime 实现
     思路：利用运行时，遍历模型中所有属性，根据模型的属性名，去字典中查找key，取出对应的值，给模型的属性赋值（从提醒：字典中取值，不一定要全部取出来）
     考虑情况：（1）、字典的键值大于模型属性数量：不需要任何处理，因为runtime是先遍历模型所有属性，再去字典中根据属性名找对应值进行赋值，多余的键值对也当然不会去看了
             （2）、模型属性数量大于字典的键值对：由于属性没有对应值会被赋值为nil，就会导致crash，我们只需加一个判断即可
             （3）、模型中嵌套模型 (KVC不能使用)
             （4）、数组中装着模型（模型的属性是一个数组，数组中是一个个模型对象）(KVC不能使用)
 */
